home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 February: Tool Chest / Apple Developer CD Series Tool Chest February 1996 (Apple Computer)(1996).iso / Sample Code / AOCE Sample Code / PowerTalk Access Modules / Sample PMSAM / PMSAM Framework / Common / UFailure.h < prev   
Encoding:
Text File  |  1995-07-28  |  4.9 KB  |  219 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        UFailure.h
  3.  
  4.     Contains:    xxx put contents here xxx
  5.  
  6.     Written by:    Tim Harnett
  7.  
  8.     Copyright:    © 1994 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.          <3>     11/2/94    TMH        deal with qDebug conditional compile
  13.          <2>     9/21/94    TMH        Remove Assertion()
  14.          <1>     9/20/94    TMH        Abandon RoadsideRest embrace Mercury
  15.  
  16.     To Do:
  17. */
  18.  
  19. // UFailure.h
  20. // Copyright © 1984-1994 by Apple Computer Inc. All rights reserved.
  21.  
  22. #ifndef __UFAILURE__
  23. #define __UFAILURE__
  24.  
  25. #ifndef __SETJMP__
  26. #include <setjmp.h>
  27. #endif
  28.  
  29. #ifndef __Debug__
  30. #include "Debug.h"
  31. #endif
  32.  
  33. #ifndef __TYPES__
  34. #include <Types.h>
  35. #endif
  36.  
  37. #ifdef qMacApp
  38.  
  39. #ifndef __UMACAPPUTILITIES__
  40. #include "UMacAppUtilities.h"
  41. #endif
  42.  
  43. #ifndef __MACAPPTYPES__
  44. #include "MacAppTypes.h"
  45. #endif
  46.  
  47. #endif qMacApp
  48.  
  49.  
  50. //----------------------------------------------------------------------------------------
  51. // This macro can be called on any variable to keep it out of a register. It is
  52. // used specifically in exception handling. Kludge to be used till volatile or
  53. // C++ exception handling is implemented.
  54. //----------------------------------------------------------------------------------------
  55.  
  56. #define VOLATILE(a) ((void) &a)
  57.  
  58.  
  59. //----------------------------------------------------------------------------------------
  60. // Max and min error number constants
  61. //----------------------------------------------------------------------------------------
  62.  
  63. const short minErr = -32768;
  64. const short maxErr = 32767;
  65.  
  66.  
  67. //----------------------------------------------------------------------------------------
  68. // FailInfo
  69. //----------------------------------------------------------------------------------------
  70.  
  71. class FailInfo
  72. {
  73. public:
  74.     jmp_buf savedState;
  75.     OSErr error;
  76.     long message;
  77.     FailInfo* nextInfo;
  78. #if qDebugFailures
  79.     short installed;
  80. #endif
  81.  
  82. public:
  83.     FailInfo();
  84.  
  85. #if qDebugFailures
  86.     ~FailInfo();
  87. #endif
  88.  
  89.     inline void ReSignal();
  90.  
  91.     inline void Success();
  92.     
  93.     inline void Reset();
  94. };
  95.  
  96. typedef struct FailInfo *FailInfoPtr;
  97.  
  98.  
  99. //----------------------------------------------------------------------------------------
  100. // Global macro definitions
  101. //----------------------------------------------------------------------------------------
  102.  
  103. // The Try macro has taken the place of the FailInfo::Try method, for the
  104. // reason that the code has to _always_ be inline.  The decision as to
  105. // whether or not code is inlined is implemented very differently for various
  106. // compilers, and can be affected by options such as symbolics generation and
  107. // level of optimization.  Because this decision is so far out of our control,
  108. // the only real guarantee is to implement Try as a macro…
  109. //
  110. // The old way:
  111. //
  112. //         FailInfo fi;
  113. //         if (fi.Try())
  114. //         {
  115. //            …
  116. //
  117. // The new way:
  118. //         FailInfo fi;
  119. //         Try(fi)
  120. //         {
  121. //            …
  122. //
  123.  
  124. #if qPowerPC && !defined(__MWERKS__)
  125.     extern "C" {
  126.         extern int MASetJmp(jmp_buf env);
  127.         extern void MALongJmp(jmp_buf, int);
  128.     }
  129.     #define Try(f)                                    \
  130.         f.nextInfo = gTopHandler;                    \
  131.         gTopHandler = &f;                            \
  132.         if (MASetJmp(f.savedState) == 0)
  133. #else
  134.     #define Try(f)                                    \
  135.         f.nextInfo = gTopHandler;                    \
  136.         gTopHandler = &f;                            \
  137.         if (setjmp(f.savedState) == 0)
  138. #endif
  139.  
  140. //----------------------------------------------------------------------------------------
  141. // Global variable declarations
  142. //----------------------------------------------------------------------------------------
  143.  
  144. extern FailInfoPtr gTopHandler;
  145.  
  146.  
  147. //----------------------------------------------------------------------------------------
  148. // Global function declarations
  149. //----------------------------------------------------------------------------------------
  150.  
  151.  
  152. inline long BuildMessage(short lowWord, short highWord)
  153. { return ((long)highWord << 16) | lowWord; }
  154.  
  155. void Failure(OSErr error, long message);
  156.  
  157. void FailMemError();
  158.  
  159. void FailResError();
  160.  
  161. void FailNewMessage(OSErr error, long oldMessage, long newMessage);
  162.  
  163. void FailNIL(void* p);
  164.  
  165. void FailNILResource(Handle r);
  166.  
  167. void FailOSErr(OSErr error);
  168.  
  169. Boolean HandlerExists(FailInfoPtr testFailInfoPtr);
  170.  
  171. void Success(FailInfo& fi);
  172.  
  173. //••void ProgramBreak(const CStr255& grievance);
  174.  
  175. //••void ProgramReport(const CStr255& grievance, const Boolean breakInDebugger);
  176.  
  177. //----------------------------------------------------------------------------------------
  178. // FailInfo inline method definitions
  179. //----------------------------------------------------------------------------------------
  180.  
  181. inline FailInfo::FailInfo()
  182. {
  183.     error = noErr;
  184.     message = 0;
  185.     nextInfo = NULL;
  186. #if qDebugFailures
  187.     installed = false;
  188. #endif
  189. }
  190.  
  191. #if qDebugFailures
  192. inline FailInfo::~FailInfo()
  193. {
  194.     if (installed)
  195.         ASSERTPRINT(false,("You forgot to call success for your failure handler"));
  196. }
  197. #endif
  198.  
  199. inline void FailInfo::ReSignal() { ::Failure(error, message); }
  200.  
  201. #if qDebugFailures
  202. inline void FailInfo::Success() { ::Success(*this); }
  203. #else
  204. inline void FailInfo::Success() { gTopHandler = nextInfo; }
  205. #endif
  206.  
  207. inline void FailInfo::Reset()
  208. {
  209.     error = noErr;
  210.     message = 0;
  211.     nextInfo = NULL;
  212. #if qDebugFailures
  213.     installed = 0;
  214. #endif
  215. }
  216.  
  217.  
  218. #endif
  219.